package classDemo;

import java.lang.reflect.Constructor;

/*
通过Class对象可以获取某个类中的：构造方法、成员变量、成员方法；并访问成员；
   获取构造方法：
 * 1).批量的方法：
 *    public Constructor[] getConstructors()：所有”公有的”构造方法
      public Constructor[] getDeclaredConstructors()：获取所有的构造方法(包括私有、受保护、默认、公有)
 *  2).获取单个的方法，并调用：
 *     public Constructor getConstructor(Class… parameterTypes):获取单个的”公有的”构造方法：
 *     public Constructor getDeclaredConstructor(Class… parameterTypes):获取”某个构造方法”可以是私有的，或受保护、默认、公有；
 *     调用构造方法：
 *     Constructor–>newInstance(Object… initargs)
 */
public class getConstructor {

    public static void main(String[] args) throws Exception {

            //加载Class对象
            Class clazz = Class.forName("classDemo.Student");

            //获取所有公有构造方法
            System.out.println("==========获取所有公有构造方法=============");
            Constructor[] constructors = clazz.getConstructors();
            for(Constructor c: constructors) {
                System.out.println(c);
            }

            //获取所有构造方法
            System.out.println("===========获取所有构造方法===============");
            constructors = clazz.getDeclaredConstructors();
            for(Constructor c : constructors) {
                System.out.println(c);
            }

            //获取公有、无参的构造方法
            System.out.println("获取公有、无参的构造方法");
            Constructor constructor = clazz.getConstructor(null);
            //1>、因为是无参的构造方法所以类型是一个null,不写也可以：这里需要的是一个参数的类型，切记是类型
            //2>、返回的是描述这个无参构造函数的类对象。
        System.out.println(constructor);
        //调用构造方法
        Object obj = constructor.newInstance();
        //  System.out.println("obj = " + obj);
        //        //  Student stu = (Student)obj;
        //
        //        System.out.println("******************获取私有构造方法，并调用*******************************");
        //        constructor = clazz.getDeclaredConstructor(char.class);
        //        System.out.println(constructor);
        //        //调用构造方法
        constructor.setAccessible(true);//暴力访问(忽略掉访问修饰符)
        obj = constructor.newInstance('男');
        /*
         调用构造方法：Constructor–>newInstance(Object… initargs)
         2、newInstance是 Constructor类的方法（管理构造函数的类）
         api的解释为：newInstance(Object… initargs)使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例，并用指定的初始化参数初始化该实例。它的返回值是T类型，所以newInstance是创建了一个构造方法的声明类的新实例对象。并为之调用
         */

    }
}
